﻿using System.Net.Sockets;
using System.Net;
using Newtonsoft.Json.Linq;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium;

namespace 天离安全_天擎.Tl_SerVices
{
    /// <summary>
    /// 爬虫核心服务
    /// </summary>
    public class Tl_SerVices_WebPageAnalyzer
    {
        /// <summary>
        /// 核心首页服务，主要获取所有加载的资源文件，采用监听器实现
        /// </summary>
        /// <param name="url"></param>
        /// <returns></returns>
        public async Task<List<string>> FetchAssetsFromUrlAsync(string url)
        {
            // 创建一个集合存储数据
            var assets = new List<string>();
            // 查找可用端口
            int port = FindAvailablePort(8000, 9000);
            if (port == -1)
            {
                Console.WriteLine("未找到可用的端口！");
                return assets; // 如果没有可用端口，直接返回空列表
            }
            // 设置 Chrome 配置
            var options = new ChromeOptions();
            options.AddArgument("--headless"); // 无头模式
            options.AddArgument("--disable-gpu");
            options.AddArgument("--no-sandbox");

            // 忽略 SSL 证书错误
            options.AddArgument("--ignore-certificate-errors");
            options.AddArgument("--allow-insecure-localhost");
            options.AddArgument("--disable-dev-shm-usage"); // 解决某些环境下的共享内存问题
            options.AddArgument($"--remote-debugging-port={port}"); // 使用可用的调试端口
            options.SetLoggingPreference(OpenQA.Selenium.LogType.Performance, OpenQA.Selenium.LogLevel.All);



            if (Tl_Api.CrawlerScan_Api.Proxy_Status == false)
            {
                Console.WriteLine("未启用代理");
            }
            else if(Tl_Api.CrawlerScan_Api.Proxy_Status == true)
            {
                string proxy = $"{Tl_Api.CrawlerScan_Api.Socks5Proxy_IP}:{Tl_Api.CrawlerScan_Api.Socks5Proxy_Port}";
                if (IsProxyAvailable(proxy))
                {
                    options.AddArgument($"--proxy-server=socks5://{proxy}");
                    Console.WriteLine("代理可用，设置代理访问。");
                }
                else
                {
                    Console.WriteLine("代理不可用，跳过代理设置。");
                }
                //options.AddArgument($"--proxy-server=socks5://{Tl_Api.CrawlerScan_Api.Socks5Proxy_IP}:{Tl_Api.CrawlerScan_Api.Socks5Proxy_Port}");
            }
            // 启用性能日志
            options.SetLoggingPreference(OpenQA.Selenium.LogType.Performance, OpenQA.Selenium.LogLevel.All);

            using (var driver = new ChromeDriver(options))
            {
                // 访问 URL
                driver.Navigate().GoToUrl(url);

                // 等待页面加载完成
                await Task.Delay(5000); // 可以根据需要调整等待时间

                // 获取所有请求的网络资源
                var performanceLogs = driver.Manage().Logs.GetLog(OpenQA.Selenium.LogType.Performance);
                foreach (var log in performanceLogs)
                {
                    // 解析 JSON 日志
                    var logEntry = log.Message;

                    try
                    {
                        // 解析 JSON
                        var json = JObject.Parse(logEntry);

                        // 检查 JSON 结构
                        var message = json["message"];
                        if (message != null && message["params"] != null && message["params"]["request"] != null)
                        {
                            var urlEntry = message["params"]["request"]["url"]?.ToString();
                            if (!string.IsNullOrEmpty(urlEntry) && !assets.Contains(urlEntry))
                            {
                                //assets.Add(urlEntry);
                                //Console.WriteLine("请求的资源: " + urlEntry);
                                Tl_Api.CrawlerScan_Api.Scan_Info.Append(urlEntry + "\r\n");
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Tl_Api.CrawlerScan_Api.Scan_Error.Append(ex.ToString());
                    }
                }
            }

            return assets;
        }

        private int FindAvailablePort(int startPort, int endPort)
        {
            for (int port = startPort; port <= endPort; port++)
            {
                if (IsPortAvailable(port))
                {
                    return port; // 返回第一个可用端口
                }
            }
            return -1; // 未找到可用端口
        }

        private bool IsPortAvailable(int port)
        {
            try
            {
                // 创建一个 TCP 客户端
                using (var client = new TcpClient())
                {
                    // 尝试连接到指定的端口
                    client.Connect(IPAddress.Loopback, port);
                    return false; // 如果连接成功，端口已占用
                }
            }
            catch (SocketException)
            {
                return true; // 连接失败，端口可用
            }
        }
        private bool IsProxyAvailable(string proxy)
        {
            try
            {
                // 创建一个 HTTP 请求，使用 SOCKS5 代理进行连接
                var handler = new HttpClientHandler
                {
                    Proxy = new WebProxy(proxy),
                    UseProxy = true,
                };

                using (var client = new HttpClient(handler))
                {
                    client.Timeout = TimeSpan.FromSeconds(5); // 设置超时
                    var response = client.GetAsync("https://www.baidu.com").Result;
                    return response.IsSuccessStatusCode; // 返回请求是否成功
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"代理检查失败: {ex.Message}");
                return false; // 代理不可用
            }
        }
    }
}
